package com.zc.im.seqsvr.service;

import com.zc.im.common.r2dbc.domain.AbstractBase;
import com.zc.im.seqsvr.repository.AbstractBaseRepository;
import org.springframework.data.r2dbc.core.R2dbcEntityOperations;
import org.springframework.data.relational.core.query.Query;
import org.springframework.data.relational.core.query.Update;
import org.springframework.r2dbc.core.DatabaseClient;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Collection;

/**
 * Project：download
 * Date：2021/9/26
 * Time：10:35
 * Description：基础接口类
 *
 * @author 小帅气
 * @version 1.0
 */
public interface AbstractBaseService<T extends AbstractBase, D, E extends AbstractBaseRepository> {

    /**
     * 根据id查找
     *
     * @param id id
     * @return 实体
     */
    Mono<T> findById(D id);

    /**
     * 查找所有
     *
     * @return 实体集合
     */
    Flux<T> findAll();

    ///**
    // * 根据userId查询
    // *
    // * @param userId userId
    // * @return 对应实体
    // */
    //Mono<T> findOneByUserId(Long userId);
    //
    ///**
    // * 根据userId查询
    // *
    // * @param userId userId
    // * @return 多个元素
    // */
    //Flux<T> findAllByUserId(Long userId);

    /**
     * 根据id的集合查找
     *
     * @param ids id集合
     * @return 实体集合
     */
    Flux<T> findByIds(Collection<D> ids);


    /**
     * 保存
     *
     * @param t 实体
     * @return 实体
     */
    Mono<T> save(T t);

    /**
     * 全部保存
     *
     * @param iterable 集合
     * @return Flux
     */
    Flux<T> saveAll(Iterable<T> iterable);

    /**
     * 删除
     *
     * @param t 实体
     * @return mono实体
     */
    Mono<T> delete(T t);

    /**
     * 获取数据访问仓库
     *
     * @return 数据访问库
     */
    E getRepository();

    /**
     * 获取databaseClient客户端
     *
     * @return DatabaseClient
     */
    DatabaseClient getDatabaseClient();

    /**
     * 获取操作类
     *
     * @return R2dbcEntityOperations
     */
    R2dbcEntityOperations getOperations();

    /**
     * 获取entity的类型
     *
     * @return class
     */
    Class<T> getEntityClass();

    /**
     * 修改
     *
     * @param query  查询条件
     * @param update 修改的字段与值
     * @return 受影响行数
     */
    Mono<Integer> update(Query query, Update update);
}
